/*
 * JugadorGrupo4.java
 *
 * Created on 31 de octubre de 2009, 16:58
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package cuatroenraya.jugadores;
import cuatroenraya.Jugador;
import cuatroenraya.gui.*;
import java.lang.Runnable;
import java.util.Arrays;
/**
 *
 * @author Admin
 */
public class JugadorAlumnoG4 extends cuatroenraya.Jugador{
 
    
    class NodoG{
        
        NodoG nodos[];
        public int tablero[][];
        int indice[];
         int valor = 100;
        /*Constructor.*/
        NodoG(){
            tablero = new int[8][8];
            indice = new int [2];
        }
    }
 
 NodoG arbol = new NodoG();
 NodoG ganador = new NodoG();
 int [][] tablero;
 

       
  /**El metodo jugar nos indica en cada jugada cual es la mejor opcion posible entre todas las jugadas
   * posibles a realizar, una vez seleccionada la mejor opcion y jugado el adversario se abriran nuevas posibilidades
   *que podran ser seleccionadas en la proxima jugada
   */
          
  public int[] jugar(int[][] tablero) {
        //creamos una lista donde estaran las opciones actuales 
        arbol.nodos = new NodoG[100];
        for (int x = 0; x < 100; x++)
        {
        arbol.nodos[x] = new NodoG();
        }
        int g = 0;
        int[] jugada = new int[2];
        
     /** Buscamos las jugadas disponibles y les asignamos un puntaje segun su valor para el juego, se aplican if
      *para analizar todas las posbilidades de juego cubriendo las jugadas del rival y generando las propias
      */
        
        for (int i = 0; i < 8 ; i ++){
            for (int j = 0; j < 8; j++){
                if (tablero[i][j] == 2){
                    if ( (j < 5 && tablero[i][j+1]== 2 && tablero[i][j+2]== 2 && tablero[i][j+3] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i;
                                 arbol.nodos[g].indice[1] = j+3;
                                 g++;
                                
                            }
                    if ( (j < 5 && tablero[i][j+1]== 2 && tablero[i][j+2]== 0 && tablero[i][j+3] == 0)) {                          
                                 arbol.nodos[g].valor = 4;
                                 arbol.nodos[g].indice[0] = i;
                                 arbol.nodos[g].indice[1] = j+2;
                                
                                g++;
                            }
                     if ( (j < 5 && tablero[i][j+1]== 2 && tablero[i][j+3]== 2 && tablero[i][j+2] == 0)) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i;
                                 arbol.nodos[g].indice[1] = j+2;
                                
                                g++;
                            }
                     if ( (j > 2 && tablero[i][j-1]== 2 && tablero[i][j-2]== 2 && tablero[i][j-3] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i;
                                 arbol.nodos[g].indice[1] = j-3;
                                
                                g++;
                            }
                    if ( (j > 2 && tablero[i][j-1]== 2 && tablero[i][j-2]== 0 && tablero[i][j-3] == 0 )) {                          
                                 arbol.nodos[g].valor = 4;
                                 arbol.nodos[g].indice[0] = i;
                                 arbol.nodos[g].indice[1] = j-2;
                                
                                g++;
                            }
                    if ( (j > 2 && tablero[i][j-1]== 2 && tablero[i][j-3]== 2 && tablero[i][j-2] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i;
                                 arbol.nodos[g].indice[1] = j-2;
                                
                                g++;
                            }
                    if ( (i < 5 && tablero[i+1][j]== 2 && tablero[i+2][j]== 2 && tablero[i+3][j] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i+3;
                                 arbol.nodos[g].indice[1] = j;
                               
                                g++;
                            }
                    if ( (i < 5 && tablero[i+1][j]== 2 && tablero[i+2][j]== 0 && tablero[i+3][j] == 0 )) {                          
                                 arbol.nodos[g].valor = 4;
                                 arbol.nodos[g].indice[0] = i+2;
                                 arbol.nodos[g].indice[1] = j;
                                
                                g++;
                            }

                    if ( (i < 5 && tablero[i+1][j]== 2 && tablero[i+3][j]== 2 && tablero[i+2][j] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i+2;
                                 arbol.nodos[g].indice[1] = j;
                                
                                g++;
                            }
                    if ( (i > 2 && tablero[i-1][j]== 2 && tablero[i-2][j]== 2 && tablero[i-3][j] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i-3;
                                 arbol.nodos[g].indice[1] = j;
                               
                                g++;
                            }
                    if ( (i > 2 && tablero[i-1][j]== 2 && tablero[i-2][j]== 0 && tablero[i-3][j] == 0 )) {                          
                                 arbol.nodos[g].valor = 4;
                                 arbol.nodos[g].indice[0] = i-2;
                                 arbol.nodos[g].indice[1] = j;
                                
                                g++;
                            }
                    if ( (i > 2 && tablero[i-1][j]== 2 && tablero[i-3][j]== 2 && tablero[i-2][j] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i-2;
                                 arbol.nodos[g].indice[1] = j;
                                
                                g++;
                            }
                     if ( (j < 5 && i < 5 && tablero[i+1][j+1]== 2 && tablero[i+2][j+2]== 2 && tablero[i+3][j+3] == 0)) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i+3;
                                 arbol.nodos[g].indice[1] = j+3;
                                
                                g++;
                            }
                     if ( (j < 5 && i < 5 && tablero[i+1][j+1]== 2 && tablero[i+2][j+2]== 0 && tablero[i+3][j+3] == 0)) {                          
                                 arbol.nodos[g].valor = 4;
                                 arbol.nodos[g].indice[0] = i+2;
                                 arbol.nodos[g].indice[1] = j+2;
                               
                                g++;
                            }
                     if ( (j < 5 && i < 5 && tablero[i+1][j+1]== 2 && tablero[i+3][j+3]== 2 && tablero[i+2][j+2] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i+2;
                                 arbol.nodos[g].indice[1] = j+2;
                               
                                g++;
                            }
                     if ( (j >2 && i > 2 && tablero[i-1][j-1]== 2 && tablero[i-2][j-2]== 2 && tablero[i-3][j-3] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i-3;
                                 arbol.nodos[g].indice[1] = j-3;
                                
                                g++;
                            }
                    if ( (j >2 && i > 2 && tablero[i-1][j-1]== 2 && tablero[i-2][j-2]== 0 && tablero[i-3][j-3] == 0 )) {                          
                                 arbol.nodos[g].valor = 4;
                                 arbol.nodos[g].indice[0] = i-2;
                                 arbol.nodos[g].indice[1] = j-2;
                                
                                g++;
                            }
                     if ( (j >2 && i > 2 && tablero[i-1][j-1]== 2 && tablero[i-3][j-3]== 2 && tablero[i-2][j-2] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i-2;
                                 arbol.nodos[g].indice[1] = j-2;
                               
                                g++;
                            }
                     if ( (j < 5 && i > 2 && tablero[i-1][j+1]== 2 && tablero[i-2][j+2]== 2 && tablero[i-3][j+3] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i-3;
                                 arbol.nodos[g].indice[1] = j+3;
                                
                                g++;
                            }
                    if ( (j < 5 && i > 2 && tablero[i-1][j+1]== 2 && tablero[i-2][j+2]==0 && tablero[i-3][j+3] == 0 )) {                          
                                 arbol.nodos[g].valor = 4;
                                 arbol.nodos[g].indice[0] = i-2;
                                 arbol.nodos[g].indice[1] = j+2;
                                
                                g++;
                            }
                     if ( (j < 5 && i > 2 && tablero[i-1][j+1]== 2 && tablero[i-3][j+3]== 2 && tablero[i-2][j+2] == 0 )) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i-2;
                                 arbol.nodos[g].indice[1] = j+2;
                                
                                g++;
                            }
                     if ( (j > 2 && i < 5 && tablero[i+1][j-1]== 2 && tablero[i+3][j-3]== 2 && tablero[i+2][j-2] == 0)) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i+2;
                                 arbol.nodos[g].indice[1] = j-2;
                                
                                g++;
                            }
                     if ( (j > 2 && i < 5 && tablero[i+1][j-1]== 2 && tablero[i+2][j-2]== 2 && tablero[i+3][j-3] == 0)) {                          
                                 arbol.nodos[g].valor = 2;
                                 arbol.nodos[g].indice[0] = i+3;
                                 arbol.nodos[g].indice[1] = j-3;
                               
                                g++;
                            }
                     if ( (j > 2 && i < 5 && tablero[i+1][j-1]== 2 && tablero[i+2][j-2]== 0)) {                          
                                 arbol.nodos[g].valor = 4;
                                 arbol.nodos[g].indice[0] = i+2;
                                 arbol.nodos[g].indice[1] = j-2;
                                
                                g++;
                            }
                    
                    
                }
                else
                            {
                                if(tablero[i][j] == 1) {
                                            if( i < 5 && tablero[i+1][j] == 1 && tablero[i+2][j] == 1 && tablero[i+3][j] == 0) {
                                                 arbol.nodos[g].valor = 0;
                                                 arbol.nodos[g].indice[0] = i+3;
                                                 arbol.nodos[g].indice[1] = j;
                                                 
                                                 g++;
                                            }
                                            else {
                                                    if ( i < 5 && tablero[i+1][j] == 0 && tablero[i+2][j] != 2 && tablero[i+3][j] != 2 ){
                                                    arbol.nodos[g].valor = 5;
                                                     arbol.nodos[g].indice[0] = i+1;
                                                     arbol.nodos[g].indice[1] = j;
                                                     
                                                     g++;
                                                    } else {
                                                    if ( i < 5 && tablero[i+1][j] == 1  && tablero[i+2][j] == 0 && tablero[i+3][j] == 0) {
                                                    arbol.nodos[g].valor = 3;
                                                     arbol.nodos[g].indice[0] = i+2;
                                                     arbol.nodos[g].indice[1] = j;
                                                     
                                                     g++;
                                                    }
                                                    }
                                                     }
                                            if(i > 2 && tablero[i-1][j] == 1 && tablero[i-2][j] == 1 && tablero[i-3][j] == 0) {
                                                 arbol.nodos[g].valor = 0;
                                                 arbol.nodos[g].indice[0] = i-3;
                                                 arbol.nodos[g].indice[1] = j;
                                                 
                                                 g++;
                                            }
                                            else {
                                                    if ( i > 2 && tablero[i-1][j] == 0 && tablero[i-2 ][j] != 2 && tablero[i-3][j] != 2){
                                                    arbol.nodos[g].valor = 5;
                                                     arbol.nodos[g].indice[0] = i-1;
                                                     arbol.nodos[g].indice[1] = j;
                                                     
                                                     g++;
                                                    }
                                                    else
                                                    {
                                                    if ( i > 2 && tablero[i-1][j] == 1  && tablero[i-2][j] == 0 && tablero[i-3][j] == 0) {
                                                    arbol.nodos[g].valor = 3;
                                                     arbol.nodos[g].indice[0] = i-2;
                                                    arbol.nodos[g].indice[1] = j;
                                                     
                                                     g++;
                                                    }
                                                    }
                                                     }
                                            if(j < 5 && tablero[i][j+1] == 1 && tablero[i][j+2] == 1 && tablero[i][j+3] == 0) {
                                                 arbol.nodos[g].valor = 0;
                                                 arbol.nodos[g].indice[0] = i;
                                                 arbol.nodos[g].indice[1] = j+3;
                                                 
                                                 g++;
                                            }
                                            else {
                                                    if ( j < 5 && tablero[i][j+1] == 0 && tablero[i][j+2] != 2 && tablero[i][j+3] != 2 ){
                                                    arbol.nodos[g].valor = 5;
                                                     arbol.nodos[g].indice[0] = i;
                                                     arbol.nodos[g].indice[1] = j+1;
                                                     
                                                     g++;
                                                    }
                                                    else {
                                                    if ( j < 5 && tablero[i][j+1] == 1  && tablero[i][j+2] == 0 && tablero[i][j+3] == 0) {
                                                    arbol.nodos[g].valor = 3;
                                                     arbol.nodos[g].indice[0] = i;
                                                     arbol.nodos[g].indice[1] = j+2;
                                                  
                                                     g++;
                                                    }
                                                    }
                                                     }
                                            if(j > 2 && tablero[i][j-1] == 1 && tablero[i][j-2] == 1 && tablero[i][j-3] == 0) {
                                                 arbol.nodos[g].valor = 0;
                                                 arbol.nodos[g].indice[0] = i;
                                                 arbol.nodos[g].indice[1] = j-3;
                                                 
                                                 g++;
                                            }
                                            else {
                                                    if ( j > 2 && tablero[i][j-1] == 0 && tablero[i][j-2] !=2 && tablero[i][j-3] != 2 ){
                                                    arbol.nodos[g].valor = 5;
                                                     arbol.nodos[g].indice[0] = i;
                                                     arbol.nodos[g].indice[1] = j-1;
                                                    
                                                     g++;
                                                    }
                                                    else {
                                                    if ( j > 2 && tablero[i][j-1] == 1  && tablero[i][j-2] == 0 && tablero[i][j-3] == 0) {
                                                    arbol.nodos[g].valor = 3;
                                                     arbol.nodos[g].indice[0] = i;
                                                     arbol.nodos[g].indice[1] = j-2;
                                                   
                                                     g++;
                                                    }
                                                    }
                                                     }
                                            if( j < 5 && i < 5 && tablero[i+1][j+1] == 1 && tablero[i+2][j+2] == 1 && tablero[i+3][j+3] == 0) {
                                                 arbol.nodos[g].valor = 0;
                                                 arbol.nodos[g].indice[0] = i+3;
                                                 arbol.nodos[g].indice[1] = j+3;
                                                 
                                                 g++;
                                            }
                                            else {
                                                    if ( j < 5 && i < 5 && tablero[i+1][j+1] == 0 && tablero[i+2][j+2] != 2 && tablero[i+3][j+3] != 2 ){
                                                    arbol.nodos[g].valor = 5;
                                                     arbol.nodos[g].indice[0] = i+1;
                                                     arbol.nodos[g].indice[1] = j+1;
                                                     
                                                     g++;
                                                    }
                                                    else {
                                                     if ( j < 5 && i < 5 && tablero[i+1][j+1] == 1 && tablero[i+2][j+2] == 0 && tablero[i+3][j+3] == 0){
                                                    arbol.nodos[g].valor = 3;
                                                     arbol.nodos[g].indice[0] = i+2;
                                                     arbol.nodos[g].indice[1] = j+2;
                                                    
                                                     g++;
                                                    }
                                                    }
                                                     }
                                            if(j > 2 && i > 2 && tablero[i-1][j-1] == 1 && tablero[i-2][j-2] == 1 && tablero[i-3][j-3] == 0) {
                                                 arbol.nodos[g].valor = 0;
                                                 arbol.nodos[g].indice[0] = i-3;
                                                 arbol.nodos[g].indice[1] = j-3;
                                                
                                                 g++;
                                            }
                                            else {
                                                    if (j > 2 && i > 2 && tablero[i-1][j-1] == 0 && tablero[i-2][j-2] !=2 && tablero[i-3][j-3] != 2 ){
                                                    arbol.nodos[g].valor = 5;
                                                     arbol.nodos[g].indice[0] = i-1;
                                                     arbol.nodos[g].indice[1] = j-1;
                                                    
                                                     g++;
                                                    }
                                                    else {
                                                    if (j > 2 && i > 2 && tablero[i-1][j-1] == 1 && tablero[i-2][j-2] == 0 && tablero[i-3][j-3] == 0){
                                                    arbol.nodos[g].valor = 3;
                                                     arbol.nodos[g].indice[0] = i-2;
                                                     arbol.nodos[g].indice[1] = j-2;
                                                     
                                                     g++;
                                                    }
                                                    }
                                                     }
                                            if(j < 5 && i > 2 && tablero[i-1][j+1] == 1 && tablero[i-2][j+2] == 1 && tablero[i-3][j+3] == 0) {
                                                 arbol.nodos[g].valor = 0;
                                                 arbol.nodos[g].indice[0] = i-3;
                                                 arbol.nodos[g].indice[1] = j+3;
                                                 
                                                 g++;
                                            }
                                            else {
                                                    if (j < 5 && i > 2 && tablero[i-1][j+1] == 0 && tablero[i-2][j+2] !=2 && tablero[i-3][j+3] != 2 ){
                                                    arbol.nodos[g].valor = 5;
                                                     arbol.nodos[g].indice[0] = i-1;
                                                     arbol.nodos[g].indice[1] = j+1;
                                                     
                                                     g++;
                                                    }
                                                    else {
                                                     if (j < 5 && i > 2 && tablero[i-1][j+1] == 1 && tablero[i-2][j+2] == 0 && tablero[i-3][j+3] == 0){
                                                    arbol.nodos[g].valor = 3;
                                                     arbol.nodos[g].indice[0] = i-2;
                                                     arbol.nodos[g].indice[1] = j+2;
                                                    
                                                     g++;
                                                    }
                                                    }
                                                     }
                                            if(j > 2 && i < 5 && tablero[i+1][j-1] == 1 && tablero[i+2][j-2] == 1 && tablero[i+3][j-3] == 0) {
                                                 arbol.nodos[g].valor = 0;
                                                 arbol.nodos[g].indice[0] = i+3;
                                                 arbol.nodos[g].indice[1] = j-3;
                                                 
                                                 g++;
                                            }
                                            else {
                                                    if (j > 2 && i < 5 && tablero[i+1][j-1] == 0 && tablero[i+2][j-2] !=2 && tablero[i+3][j-3] != 2 ){
                                                    arbol.nodos[g].valor = 5;
                                                     arbol.nodos[g].indice[0] = i+1;
                                                     arbol.nodos[g].indice[1] = j-1;
                                                     
                                                     g++;
                                                    }
                                                    else {
                                                     if (j > 2 && i < 5 && tablero[i+1][j-1] == 1 && tablero[i+2][j-2] == 0 && tablero[i+3][j-3] == 0){
                                                    arbol.nodos[g].valor = 3;
                                                     arbol.nodos[g].indice[0] = i+2;
                                                     arbol.nodos[g].indice[1] = j-2;
                                                     g++;
                                                    }
                                                     }
                                     }
                                }
                                else {                                        
                                                     if (tablero[i][j] == 0){
                                                             arbol.nodos[g].valor = 6;
                                                             arbol.nodos[g].indice[0] = 5;
                                                             arbol.nodos[g].indice[1] = 3;
                                                             g++;
                                                                   }
                                                                   
                                                                               
                                                                                     
                                }
                               
                            }
                
  }
       
        }
    
          
          
      //Obtenemos la mejor jugada posible en este momento del tablero
      NodoG ganador = calcularMejor(arbol);
      arbol.nodos = null;
      return ganador.indice;
      
  }
 
      
// Mtodo que permite obtener la mejor jugada posible segun el algoritmo primero el mejor
  public NodoG  calcularMejor (NodoG raiz){
      int mejor = 20;
      int nodo = 0;
  for (int i = 0; i < raiz.nodos.length; i++){
      if (raiz.nodos[i] != null && raiz.nodos[i].valor < mejor ) {
      mejor= raiz.nodos[i].valor;
      nodo= i;
      }
      
  }
  return raiz.nodos[nodo];
  
  }
 
   
 
    /** Creates a new instance of JugadorAlumno */
    public JugadorAlumnoG4() {
    numeroJugador = 4;
    nombre = "Bermudez, Fernandez, Gomez, Miranda";
    }
    

    
   
  

   

    public String devolverIntegrantes ()
    {
    return "Bermudez, Fernandez, Gomez, Miranda"; 
    }
    
    public String devolverCurso ()
    {
        return "5k3";
    }
    
    public String devolverGrupo()
    {
        return "4";
    }
    
    
}